package com.yunhe.dtu.task.task;

import com.yunhe.common.util.RedisClient;
import com.yunhe.common.util.StringUtil;
import com.yunhe.dtu.util.DingDingUtil;
import com.yunhe.dtu.util.YmlUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.util.*;


/**
 * 检查dtu数据中 一段时间未上报的数据 发预警
 */
@Service
public class DtuDataCheckTask {
    //时间差 6小时
    private Long timeDiff = 1000 * 60 * 60 * 6L;

    private List<DtuInfo> dtuList = new ArrayList<>();

    private Set<String> ignoreSid = new HashSet(){{
        add("0f029e24");
        add("0f02a820");
        add("0f02ba22");
        add("0f02b925");
        add("0f02b724");
        add("0f02c722");
        add("0f02d820");
        add("0f02bd22");
        add("0f02e023");
        add("0f02e024");
        add("0f02a221");
        add("0f02a220");
    }};

    @Autowired
    private RedisClient redisClient;

    /**
     * 解析export.yml中 转换成DtuInfo， 存储到dtuList
     * 遍历dtuList，从redis中获取对应的更新时间，不存在或超过一定时间进行预警
     */
    @Scheduled(cron = "0 0/10 * * * ? ")
    public void exec(){
        parseExportYml(); //解析export.yml
        scanKeys(); //遍历redis
    }


    //解析export.yml
    //exportMap里value后面追加园区信息
    private void parseExportYml() {
        if(!dtuList.isEmpty()){
            return;
        }
        Map<String,String> resMap = YmlUtils.getYmlByFileName("classpath:mapping/export.yml");
        resMap.forEach( (sid, data) ->{ //ex:  sid:b.0f02d820.company_office    v:B-4%成都顶俏食品有限公司（非居表）%45323788
            if(StringUtil.isBlank(sid)) return;
            String[] sidArr = sid.split("\\.");
            String[] vArr = data.split("%");
            //表号数据格式判断
            if(!StringUtil.isNumber(vArr[2])) return;

            //封装数据
            DtuInfo dtuInfo = new DtuInfo(){{
                setPark(sidArr[0]);
                setSid(sidArr[1]);
                setCompany(vArr[1]);
                setWorkshop(vArr[0]);
                setTableNo(vArr[2]);
            }};
            dtuList.add(dtuInfo);
        });
    }

    //遍历redis 扫描最近的更新时间
    private void scanKeys() {
        Long curDate = System.currentTimeMillis();
        dtuList.forEach( dtu -> {
            String lastTime = redisClient.get(dtu.getTableNo() );
            if(StringUtil.isBlank(lastTime) || curDate - Long.valueOf(lastTime) >= timeDiff){
                /*if(!StringUtil.isBlank(lastTime)){ //计算输出时差
                    System.out.println( (curDate - Long.valueOf(lastTime))/1000/60/60+"小时" );
                }*/

                //缓存中电表数据不存在 或 超过10分钟没有更新 发送预警消息
                //System.out.println(dtu.toString());
                if(!ignoreSid.contains(dtu.getSid())){ //不在忽略名单里
                    DingDingUtil.send(dtu.toString());
                }

            }
        });
    }

    class DtuInfo {
        private String park; //园区
        private String company; //公司
        private String workshop; //厂房
        private String tableNo; //表号
        private String sid; //

        public String getPark() { return park; }
        public void setPark(String park) { this.park = park; }
        public String getCompany() { return company; }
        public void setCompany(String company) { this.company = company; }
        public String getWorkshop() { return workshop; }
        public void setWorkshop(String workshop) { this.workshop = workshop; }
        public String getTableNo() { return tableNo; }
        public void setTableNo(String tableNo) { this.tableNo = tableNo; }
        public String getSid() { return sid; }
        public void setSid(String sid) { this.sid = sid; }

        @Override
        public String toString(){
            return new StringBuilder()
                    .append("园区：").append(this.park).append("； ")
                    .append("公司：").append(this.company).append("； ")
                    .append("厂房：").append(this.workshop).append("； ")
                    .append("表号：").append(this.tableNo).append("； ")
                    .append("sid：").append(this.sid).append(" 掉线").toString();
        }
    }

}
